home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / common / tclang.c < prev    next >
C/C++ Source or Header  |  2004-05-10  |  5KB  |  233 lines

  1. /*-------------------------------------------------------------
  2.   tclang.c : read settings of tclang*.txt
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "common.h"
  10.  
  11. /* Globals */
  12.  
  13. void CheckTCLangVersion(void);
  14. char* MyString(UINT uID, const char *entry);
  15. HFONT CreateDialogFont(void);
  16. void SetDialogLanguage(HWND hDlg, const char *section, HFONT hfont);
  17.  
  18. /* Statics */
  19. const char *GetControlTitle(char *dst, const char *src, int nMax);
  20.  
  21. /* Externs */
  22.  
  23. extern HINSTANCE g_hInst;
  24. extern char g_langfile[];
  25.  
  26. /*-------------------------------------------
  27.   compare version strings
  28. ---------------------------------------------*/
  29. void CheckTCLangVersion(void)
  30. {
  31.     char buf[80];
  32.     
  33.     if(GetPrivateProfileString("Main", "Version", "", buf,
  34.         80, g_langfile) > 0)
  35.     {
  36.         if(strcmp(buf, TCLOCKVERSION) == 0) return;
  37.     }
  38.     g_langfile[0] = 0;
  39. }
  40.  
  41. /*-------------------------------------------
  42.   returns a resource string
  43. ---------------------------------------------*/
  44. char* MyString(UINT uID, const char *entry)
  45. {
  46.     static char buf[80];
  47.     
  48.     if(g_langfile[0] == 0 ||
  49.         GetPrivateProfileString("String", entry, "", buf,
  50.             80, g_langfile) == 0)
  51.     {
  52.         LoadString(g_hInst, uID, buf, 80);
  53.     }
  54.     
  55.     return buf;
  56. }
  57.  
  58. /*-------------------------------------------
  59.   create dialog font
  60. ---------------------------------------------*/
  61. HFONT CreateDialogFont(void)
  62. {
  63.     char buf[80], name[80], nstr[10];
  64.     int size;
  65.     
  66.     if(g_langfile[0] == 0) return NULL;
  67.     
  68.     GetPrivateProfileString("Main", "DialogFont", "", buf,
  69.         80, g_langfile);
  70.     parse(name, buf, 0, 80);
  71.     if(name[0] == 0) return NULL;
  72.     
  73.     parse(nstr, buf, 1, 10);
  74.     if(nstr[0] == 0) size = 9;
  75.     else
  76.     {
  77.         size = atoi(nstr);
  78.         if(size == 0) size = 9;
  79.     }
  80.     
  81.     return CreateMyFont(name, size, FW_NORMAL, 0, 0);
  82. }
  83.  
  84. /*-------------------------------------------
  85.   change title and size of a dialog and its controls
  86. ---------------------------------------------*/
  87. void SetDialogLanguage(HWND hDlg, const char *section, HFONT hfont)
  88. {
  89.     HWND hwnd;
  90.     HDC hdc;
  91.     SIZE sz;
  92.     char *test = "TClock Light";
  93.     char entry[10], buf[160], title[80];
  94.     char classname[80];
  95.     RECT rcCtrl, rcWin, rcClient;
  96.     POINT ptCtrl;
  97.     int xunit;
  98.     int x, y, w, h;
  99.     int maxwidth, winwidth, framewidth;
  100.     int i;
  101.     BOOL bSize;
  102.     
  103.     if(g_langfile[0] == 0) return;
  104.     
  105.     if(GetPrivateProfileString("Main", "Version", "", buf,
  106.         80, g_langfile) > 0)
  107.     {
  108.         if(strcmp(buf, TCLOCKVERSION) != 0) return;
  109.     }
  110.     
  111.     if(hfont != NULL) ;
  112.     //    SendMessage(hDlg, WM_SETFONT, (WPARAM)hfont, 0);
  113.     else
  114.         hfont = (HFONT)SendMessage(hDlg, WM_GETFONT, 0, 0);
  115.     
  116.     hdc = GetDC(hDlg);
  117.     SelectObject(hdc, hfont);
  118.     GetTextExtentPoint32(hdc, test, strlen(test), &sz);
  119.     ReleaseDC(hDlg, hdc);
  120.     
  121.     xunit = (sz.cx * 100) / strlen(test);
  122.     
  123.     GetPrivateProfileString(section, "Title", "", title,
  124.         80, g_langfile);
  125.     
  126.     if(title[0])
  127.         SetWindowText(hDlg, title);
  128.     
  129.     bSize = TRUE;
  130.     if(strcmp(section, "TestSound") == 0) bSize = FALSE;
  131.     
  132.     hwnd = GetWindow(hDlg, GW_CHILD);
  133.     maxwidth = 0;
  134.     for(i = 0; hwnd; i++)
  135.     {
  136.         const char *p, *sp;
  137.         
  138.         wsprintf(entry, "Line%02d", i + 1);
  139.         GetPrivateProfileString(section, entry, "", buf,
  140.             160, g_langfile);
  141.         if(!buf[0]) break;
  142.         
  143.         p = sp = buf;
  144.         
  145.         while(*p)
  146.         {
  147.             if(*p == '[')
  148.             {
  149.                 const char *xp = p;
  150.                 p = GetControlTitle(title, p, 80);
  151.                 
  152.                 if(hfont != NULL)
  153.                     SendMessage(hwnd, WM_SETFONT, (WPARAM)hfont, 0);
  154.                 if(title[0])
  155.                     SetWindowText(hwnd, title);
  156.                 
  157.                 GetClassName(hwnd, classname, 80);
  158.                 if(bSize &&
  159.                     strcmp(classname, "msctls_updown32") != 0)
  160.                 {
  161.                     GetWindowRect(hwnd, &rcCtrl);
  162.                     ptCtrl.x = rcCtrl.left;
  163.                     ptCtrl.y = rcCtrl.top;
  164.                     ScreenToClient(hDlg, &ptCtrl);
  165.                     
  166.                     x = ((xp - sp) * xunit) / 100;
  167.                     y = ptCtrl.y;
  168.                     w = ((p - xp) * xunit) / 100;
  169.                     h = rcCtrl.bottom - rcCtrl.top;
  170.                     SetWindowPos(hwnd, NULL, x, y,
  171.                         w, h, SWP_NOZORDER);
  172.                 }
  173.                 
  174.                 hwnd = GetWindow(hwnd, GW_HWNDNEXT);
  175.                 if(*p) p++;
  176.             }
  177.             else p++;
  178.         }
  179.         
  180.         w = ((p - sp) * xunit) / 100;
  181.         if(maxwidth < w) maxwidth = w;
  182.     }
  183.     
  184.     if(!bSize) return;
  185.     
  186.     GetWindowRect(hDlg, &rcWin);
  187.     GetClientRect(hDlg, &rcClient);
  188.     winwidth = rcWin.right - rcWin.left;
  189.     framewidth = winwidth - rcClient.right;
  190.     if(maxwidth > winwidth - (xunit/100) - framewidth)
  191.     {
  192.         winwidth = maxwidth + (xunit/100) + framewidth;
  193.         SetWindowPos(hDlg, NULL, 0, 0,
  194.             winwidth,
  195.             rcWin.bottom - rcWin.top,
  196.             SWP_NOMOVE|SWP_NOZORDER);
  197.     }
  198. }
  199.  
  200. /*-------------------------------------------
  201.   get "AAA" in "[  AAA   ]"
  202. ---------------------------------------------*/
  203. const char *GetControlTitle(char *dst, const char *src, int nMax)
  204. {
  205.     const char *sp, *ep;
  206.     int i;
  207.     
  208.     if(*src != '[') return src;
  209.     src++;
  210.     
  211.     while(*src == ' ') src++;
  212.     sp = src;
  213.     
  214.     ep = NULL;
  215.     while(*src && *src != ']')
  216.     {
  217.         if(*src == ' ')
  218.         {
  219.             if(!ep) ep = src;
  220.         }
  221.         else ep = NULL;
  222.         src = CharNext(src);
  223.     }
  224.     if(!ep) ep = src;
  225.     
  226.     for(i = 0; i < nMax - 1 && sp != ep; i++)
  227.         *dst++ = *sp++;
  228.     *dst = 0;
  229.     
  230.     return src;
  231. }
  232.  
  233.